home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / freeli20.zip / 386lib2.asx < prev    next >
Text File  |  1996-07-01  |  64KB  |  2,409 lines

  1. ~~~C_STR1
  2. Ideal
  3.  
  4. Public      strlen,strcpy,strcat,strcmp
  5.  
  6. Model Tiny
  7. CodeSeg
  8. P386
  9.  
  10. ;****************** strlen() -- Get length of string
  11. ;int strlen(char *strp);
  12.  
  13. strp        equ bp+4
  14.  
  15. Proc        strlen
  16.  
  17.             push bp                 ;Set up stack frame
  18.             mov bp,sp
  19.             push si                 ;Save SI
  20.  
  21.             mov si,[strp]           ;SI = string pointer
  22.  
  23. p1_loop:    lodsb                   ;Load char
  24.             test al,al              ;Loop while not zero
  25.             jnz p1_loop
  26.  
  27.             sub si,[strp]           ;AX = length
  28.             dec si
  29.             xchg ax,si
  30.  
  31.             pop si                  ;Restore SI
  32.             pop bp                  ;Delete stack frame
  33.             ret 2                   ;Return
  34.  
  35. EndP        strlen
  36.  
  37. ;****************** strcpy() -- Copy a string
  38. ;void strcpy(char *str1, char *str2);
  39.  
  40. str1        equ bp+6
  41. str2        equ bp+4
  42.  
  43. Proc        strcpy
  44.  
  45.             push bp                 ;Set up stack frame
  46.             mov bp,sp
  47.             pusha                   ;Save all registers
  48.  
  49.             mov si,[str2]           ;SI = source
  50.             mov di,[str1]           ;DI = destination
  51.  
  52. p2_loop:    lodsb                   ;Load char
  53.             mov [di],al             ;Store char
  54.             inc di
  55.             test al,al              ;Loop while not zero
  56.             jnz p2_loop
  57.  
  58.             popa                    ;Restore registers
  59.             pop bp                  ;Delete stack frame
  60.             ret 4                   ;Return
  61.  
  62. EndP        strcpy
  63.  
  64. ;****************** strcat() -- Concatenate strings
  65. ;void strcat(char *str1, char *str2);
  66.  
  67. str1        equ bp+6
  68. str2        equ bp+4
  69.  
  70. Proc        strcat
  71.  
  72.             push bp                 ;Set up stack frame
  73.             mov bp,sp
  74.             pusha                   ;Save all registers
  75.  
  76.             mov si,[str1]           ;SI = destination
  77.  
  78. p3_cloop:   lodsb                   ;Load char
  79.             test al,al              ;Loop while not zero
  80.             jnz p3_cloop
  81.  
  82.             mov di,si               ;DI = destination
  83.             mov si,[str2]           ;SI = source
  84.             dec di
  85.  
  86. p3_loop:    lodsb                   ;Load char
  87.             mov [di],al             ;Store char
  88.             inc di
  89.             test al,al              ;Loop while not zero
  90.             jnz p3_loop
  91.  
  92.             popa                    ;Restore registers
  93.             pop bp                  ;Delete stack frame
  94.             ret 4                   ;Return
  95.  
  96. EndP        strcat
  97.  
  98. ;****************** strcmp() -- Compare strings
  99. ;void strcmp(char *str1, char *str2);
  100.  
  101. str1        equ bp+6
  102. str2        equ bp+4
  103.  
  104. Proc        strcmp
  105.  
  106.             push bp                 ;Set up stack frame
  107.             mov bp,sp
  108.             push si di              ;Save registers
  109.  
  110.             mov si,[str1]           ;SI = source
  111.             mov di,[str2]           ;DI = destination
  112.  
  113. p4_loop:    lodsb                   ;Load char 1
  114.             mov ah,[di]             ;Load char 2
  115.             inc di
  116.             cmp al,ah               ;Not equal?
  117.             jne p4_nope
  118.             test al,al              ;Loop while not zero
  119.             jnz p4_loop
  120.  
  121.             xor ax,ax               ;Equal, return 0
  122. p4_done:    pop di si               ;Restore registers
  123.             pop bp                  ;Delete stack frame
  124.             ret 4                   ;Return
  125.  
  126. p4_nope:    sub al,ah               ;Not equal, return difference
  127.             cbw                     ;in first unequal position
  128.             jmp p4_done
  129.  
  130. EndP        strcmp
  131.  
  132. End
  133.  
  134. ~~~C_STR2
  135. Ideal
  136.  
  137. Extrn       strlen:near
  138. Public      strchr,strstr
  139.  
  140. Model Tiny
  141. CodeSeg
  142. P386
  143.  
  144. ;****************** strchr() -- Search string for char
  145. ;int strchr(char *strp, int chr);
  146.  
  147. strp        equ bp+6
  148. chr         equ bp+4
  149.  
  150. Proc        strchr
  151.  
  152.             push bp                 ;Set up stack frame
  153.             mov bp,sp
  154.             push si                 ;Save SI
  155.  
  156.             mov si,[strp]           ;SI = string pointer
  157.             mov ah,[chr]            ;AH = char
  158.  
  159. p1_loop:    lodsb                   ;Load char
  160.             test al,al              ;Null, not found
  161.             jz p1_nope
  162.             cmp al,ah               ;Loop while not equal
  163.             jne p1_loop
  164.  
  165.             sub si,[strp]           ;AX = position of char
  166.             dec si
  167.             xchg ax,si
  168.  
  169. p1_done:    pop si                  ;Restore SI
  170.             pop bp                  ;Delete stack frame
  171.             ret 4                   ;Return
  172.  
  173. p1_nope:    mov ax,-1               ;Not found, return -1
  174.             jmp p1_done
  175.  
  176. EndP        strchr
  177.  
  178. ;****************** strstr() -- Search string for substring
  179. ;int strstr(char *strp, char *subp);
  180.  
  181. strp        equ bp+6
  182. subp        equ bp+4
  183.  
  184. Proc        strstr
  185.  
  186.             push bp                 ;Set up stack frame
  187.             mov bp,sp
  188.             push es                 ;Save registers
  189.             pusha
  190.  
  191.             push ds                 ;ES = DS
  192.             pop es
  193.  
  194.             mov si,[strp]           ;SI = string pointer
  195.             mov bx,[subp]           ;BX = substring pointer
  196.             push bx                 ;Get length of substring
  197.             call strlen             ;into DX
  198.             xchg dx,ax
  199.             mov ah,[bx]             ;AH = first char
  200.  
  201. p3_loop:    lodsb                   ;Load char
  202.             test al,al              ;Null, not found
  203.             jz p3_nope
  204.             cmp al,ah               ;Loop while not equal
  205.             jne p3_loop
  206.  
  207.             mov cx,dx               ;CX = length
  208.             mov di,bx               ;DI = substring
  209.             push si                 ;Save SI
  210.             dec si                  ;Push back char
  211.             repe cmpsb              ;Compare strings
  212.             pop si                  ;Restore SI
  213.             jne p3_loop             ;Loop if not equal
  214.  
  215.             sub si,[strp]           ;AX = position of char
  216.             dec si
  217.             mov es,si               ;Sneaky: save it in ES
  218.  
  219. p3_done:    popa                    ;Restore registers
  220.             mov ax,es               ;Return value in AX
  221.             pop es
  222.             pop bp                  ;Delete stack frame
  223.             ret 4                   ;Return
  224.  
  225. p3_nope:    mov ax,-1               ;Not found, return -1
  226.             mov es,ax
  227.             jmp p3_done
  228.  
  229. EndP        strstr
  230.  
  231. End
  232.  
  233. ~~~C_STR3
  234. Ideal
  235.  
  236. Public      stricmp,strlwr,strupr
  237.  
  238. Model Tiny
  239. CodeSeg
  240. P386
  241.  
  242. ;****************** stricmp() -- Compare strings, case insensitive
  243. ;void stricmp(char *str1, char *str2);
  244.  
  245. str1        equ bp+6
  246. str2        equ bp+4
  247.  
  248. Proc        stricmp
  249.  
  250.             push bp                 ;Set up stack frame
  251.             mov bp,sp
  252.             push si di              ;Save registers
  253.  
  254.             mov si,[str1]           ;SI = source
  255.             mov di,[str2]           ;DI = destination
  256.  
  257. p1_loop:    lodsb                   ;Load char 1
  258.             mov ah,[di]             ;Load char 2
  259.             inc di
  260.  
  261.             cmp al,'a'              ;Convert AL to uppercase
  262.             jb p1_setAH
  263.             cmp al,'z'
  264.             ja p1_setAH
  265.             sub al,20h
  266.  
  267. p1_setAH:   cmp ah,'a'              ;Convert AH to uppercase
  268.             jb p1_comp
  269.             cmp ah,'z'
  270.             ja p1_comp
  271.             sub ah,20h
  272.  
  273. p1_comp:    cmp al,ah               ;Equal?
  274.             jne p1_nope
  275.             test al,al              ;Loop while not zero
  276.             jnz p1_loop
  277.  
  278.             inc ax                  ;Equal, return 1
  279.  
  280. p1_done:    pop di si               ;Restore registers
  281.             pop bp                  ;Delete stack frame
  282.             ret 4                   ;Return
  283.  
  284. p1_nope:    xor ax,ax               ;Not equal, return 0
  285.             jmp p1_done
  286.  
  287. EndP        stricmp
  288.  
  289. ;****************** strlwr() -- Convert string to lowercase
  290. ;int strlwr(char *strp);
  291.  
  292. strp        equ bp+4
  293.  
  294. Proc        strlwr
  295.  
  296.             push bp                 ;Set up stack frame
  297.             mov bp,s